package basis.netease.easy;

import java.util.Scanner;

/**
 * 7-4 跳跃
 * Drizzle 被困到一条充满数字的方块路中，假设这条路由一个非负的整数数组m组成，Drizzle 最开始的位置在下标 start 处，当他位于下标i位置时可以向前或者向后跳跃m[i]步数，
 * 已知元素值为0处的位置是出口，且只能通过出口出去，不可能数组越界，也不能折返，如果跳跃的步数超出数组范围，则也定义为失败，请你通过编程计算出Drizzle能否逃出这里。
 * 输入格式: 第一行输入数组m的长度n ；第二行输入数组元素，空格分割开 第三行输入起始下标 start
 * 范围：
 * 1 <= m.length <= 5 * 10^4
 * 0 <= m[i] < m.length
 * 0 <= start < m.length
 * 输出格式: True 或 False。
 * 输入样例: 在这里给出一组输入。
 * 例如：
 * 7 4 2 3 0 3 1 2 5
 * 输出样例: 在这里给出相应的输出。
 * 例如：
 * True
 */
public class Main_3 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] m = new int[n];
        for (int i = 0; i < n; i++) {
            m[i] = sc.nextInt();
        }
        int start = sc.nextInt();
        // 额外存储版本
        int[] visit = new int[n];
        System.out.println(dfs(m, start, visit) ? "True" : "False");
        // 改良版本
        // System.out.println(dfs2(m, start) ? "True" : "False");
    }

    public static boolean dfs2(int[] m, int x) {
        if (x < 0 || x > m.length - 1) {
            return false;
        }
        if (m[x] == 0) {
            return true;
        }
        if (m[x] == -1) {
            return false; // 已访问过
        }
        int mx = m[x];
        m[x] = -1;
        return dfs2(m, x + mx) || dfs2(m, x - mx);
    }

    public static boolean dfs(int[] m, int x, int[] visit) {
        if (x < 0 || x > m.length - 1) {
            return false;
        }
        if (m[x] == 0) {
            return true;
        }
        if (visit[x] == 1) {
            return false; // 已访问过
        }
        visit[x] = 1;
        return dfs(m, x + m[x], visit) || dfs(m, x - m[x], visit);
    }

}
